技巧71 手动同步注册中心镜像

最简单的镜像同步情景是有一台与两个注册中心高速连接的机器。使用正常的Docker功能即可完成镜像复制。

问题

想要在两个注册中心之间复制一个镜像。

解决方案

手动使用Docker拉取和推送命令来传输镜像。

这个解决方案包括:

  • 从注册中心拉取镜像;
  • 给镜像重打标签;
  • 推送重打标签的镜像。

假设在test-registry.company.com有一个镜像,想要移动到stage-registry.company.com,这个过程很简单,如代码清单9-1所示。

代码清单9-1 将一个镜像从测试注册中心传输到预演注册中心

$ IMAGE=mygroup/myimage:mytag
$ OLDREG=test-registry.company.com
$ NEWREG=stage-registry.company.com
$ docker pull $OLDREG/$MYIMAGE
[...]
$ docker tag -f $OLDREG/$MYIMAGE $NEWREG/$MYIMAGE
$ docker push $NEWREG/$MYIMAGE
$ docker rmi $OLDREG/$MYIMAGE
$ docker image prune -f

这个过程有以下3个重要的点需要注意。

(1)新镜像被强制打了标签。这意味着这台机器上任何具有相同名称的旧镜像(用于层缓存而留在那儿)将丢失镜像名称,因而新的镜像可以使用所需的名称打上标签。

(2)所有没有标签的镜像已经被删除了。虽然层缓存对加速部署非常有用,但是留着无用的镜像层会很快耗尽磁盘空间。一般而言,随着时间过去,旧的层很少会被使用,变得越来越过时。

(3)可能需要使用 docker login 登录到新的注册中心中。

现在,该镜像就在新的注册中心里可用了,可供CD流水线的后续场景使用。

讨论

本技巧说明了Docker标签简单的一点:标签本身包含了它所属注册中心的信息。

多数情况下,这对用户来说是不可见的,因为他们一般是从默认的注册中心(Docker官网上的Docker Hub)拉取的。当你开始使用注册中心时,这个问题就显现了出来,因为你必须明确将注册中心的位置打进标签中,以便将其推送给正确的端点。

results matching ""

    No results matching ""